package main

import "fmt"

// 自定义类型
type myInt int

// 定义类型别名
type myFloat = float64

// 定义结构体
/*
	type 类型名 struct {
		字段名, 字段类型
		字段名, 字段类型
		...
	}
*/
// 类型名：表示自定义结构体的名称，在同一个包内不准重复
// 字段名：表示结构体字段名，结构体中的字段名必须唯一
// 字段类型：表示结构体字段的具体类型

// 定义一个"人"结构体
// 结构体命名首字母大写表示公有（其他包里可以使用），小写表示私有（只有在这个包里才能用）
// 结构体内字段命名大写表示公有，小写表示私有
type Person struct {
	name string
	age  int
	sex  string
}

func main() {
	// var a myInt = 10
	// fmt.Printf("%v %T\n", a, a) // 10 main.myInt
	// var b myFloat = 12.3
	// fmt.Printf("%v %T\n", b, b) // 12.3 float64

	// // 实例化Person结构体
	// // 格式化结构体使用 %#v
	// var p1 Person
	// p1.name = "张三"
	// p1.age = 20
	// fmt.Printf("值：%v 类型:%T\n", p1, p1)
	// fmt.Printf("值：%#v, 类型：%T\n", p1, p1) //main.Person{name:"张三", age:20, sex:""}, 类型：main.Person

	// // 结构体指针通过"."同样可以访问结构体成员
	// var p2 = new(Person)
	// p2.name = "张三"
	// p2.age = 20
	// (*p2).sex = "man"
	// fmt.Printf("值：%v 类型:%T\n", p2, p2)
	// fmt.Printf("值：%#v, 类型：%T\n", p2, p2) //&main.Person{name:"张三", age:20, sex:""}, 类型：*main.Person

	// 把结构体的地址赋值给变量也可以实现结构体的实例化
	var p3 = &Person{}
	p3.name = "张三"
	p3.age = 30
	(*p3).sex = "woman"
	fmt.Printf("值：%#v, 类型：%T\n", p3, p3) //&main.Person{name:"张三", age:20, sex:"woman"}, 类型：*main.Person

	// // 使用键值对初始化结构体数据
	// var p4 = Person{
	// 	name: "李四",
	// 	age:  20,
	// 	sex:  "男",
	// }
	// fmt.Printf("值：%#v, 类型：%T\n", p4, p4)

	// var p5 = &Person{
	// 	name: "陈五",
	// 	age:  21,
	// 	sex:  "女",
	// }
	// fmt.Printf("值：%#v, 类型：%T\n", p5, p5)

}
